home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1998 August / PC Plus SuperCD 50a Issue 142 (CD142a) (August 1998).iso / full / jbuild / setup / JBuilder / jsamples.z / molecule.jar / sunw / demo / molecule / XYZChemModel.class (.txt) < prev   
Encoding:
Java Class File  |  1997-06-04  |  4.0 KB  |  246 lines

  1. package sunw.demo.molecule;
  2.  
  3. import java.awt.Graphics;
  4. import java.io.BufferedReader;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.StreamTokenizer;
  8. import java.util.Hashtable;
  9.  
  10. class XYZChemModel {
  11.    float[] vert;
  12.    Atom[] atoms;
  13.    int[] tvert;
  14.    int[] ZsortMap;
  15.    int nvert;
  16.    int maxvert;
  17.    static Hashtable atomTable = new Hashtable();
  18.    static Atom defaultAtom;
  19.    boolean transformed;
  20.    Matrix3D mat;
  21.    float xmin;
  22.    float xmax;
  23.    float ymin;
  24.    float ymax;
  25.    float zmin;
  26.    float zmax;
  27.  
  28.    XYZChemModel() {
  29.       this.mat = new Matrix3D();
  30.       this.mat.xrot((double)20.0F);
  31.       this.mat.yrot((double)30.0F);
  32.    }
  33.  
  34.    XYZChemModel(InputStream var1) {
  35.       this();
  36.  
  37.       try {
  38.          StreamTokenizer var2 = new StreamTokenizer(new BufferedReader(new InputStreamReader(var1)));
  39.          var2.eolIsSignificant(true);
  40.          var2.commentChar(35);
  41.  
  42.          while(true) {
  43.             switch (var2.nextToken()) {
  44.                case -3:
  45.                   String var3 = var2.sval;
  46.                   double var4 = (double)0.0F;
  47.                   double var6 = (double)0.0F;
  48.                   double var8 = (double)0.0F;
  49.                   if (var2.nextToken() == -2) {
  50.                      var4 = var2.nval;
  51.                      if (var2.nextToken() == -2) {
  52.                         var6 = var2.nval;
  53.                         if (var2.nextToken() == -2) {
  54.                            var8 = var2.nval;
  55.                         }
  56.                      }
  57.                   }
  58.  
  59.                   this.addVert(var3, (float)var4, (float)var6, (float)var8);
  60.  
  61.                   while(var2.ttype != 10 && var2.ttype != -1) {
  62.                      var2.nextToken();
  63.                   }
  64.                case -2:
  65.                default:
  66.                   break;
  67.                case -1:
  68.                   var1.close();
  69.                   if (var2.ttype != -1) {
  70.                      throw new Error(var2.toString());
  71.                   } else {
  72.                      return;
  73.                   }
  74.             }
  75.          }
  76.       } catch (Exception var10) {
  77.          throw new Error("Input error: " + var10);
  78.       }
  79.    }
  80.  
  81.    int addVert(String var1, float var2, float var3, float var4) {
  82.       int var5 = this.nvert;
  83.       if (var5 >= this.maxvert) {
  84.          if (this.vert == null) {
  85.             this.maxvert = 100;
  86.             this.vert = new float[this.maxvert * 3];
  87.             this.atoms = new Atom[this.maxvert];
  88.          } else {
  89.             this.maxvert *= 2;
  90.             float[] var6 = new float[this.maxvert * 3];
  91.             System.arraycopy(this.vert, 0, var6, 0, this.vert.length);
  92.             this.vert = var6;
  93.             Atom[] var7 = new Atom[this.maxvert];
  94.             System.arraycopy(this.atoms, 0, var7, 0, this.atoms.length);
  95.             this.atoms = var7;
  96.          }
  97.       }
  98.  
  99.       Atom var9 = (Atom)atomTable.get(var1.toLowerCase());
  100.       if (var9 == null) {
  101.          var9 = defaultAtom;
  102.       }
  103.  
  104.       this.atoms[var5] = var9;
  105.       var5 *= 3;
  106.       this.vert[var5] = var2;
  107.       this.vert[var5 + 1] = var3;
  108.       this.vert[var5 + 2] = var4;
  109.       return this.nvert++;
  110.    }
  111.  
  112.    void transform() {
  113.       if (!this.transformed && this.nvert > 0) {
  114.          if (this.tvert == null || this.tvert.length < this.nvert * 3) {
  115.             this.tvert = new int[this.nvert * 3];
  116.          }
  117.  
  118.          this.mat.transform(this.vert, this.tvert, this.nvert);
  119.          this.transformed = true;
  120.       }
  121.    }
  122.  
  123.    synchronized void paint(Graphics var1) {
  124.       if (this.vert != null && this.nvert > 0) {
  125.          this.transform();
  126.          int[] var2 = this.tvert;
  127.          int[] var3 = this.ZsortMap;
  128.          if (var3 == null) {
  129.             this.ZsortMap = var3 = new int[this.nvert];
  130.             int var4 = this.nvert;
  131.  
  132.             while(true) {
  133.                --var4;
  134.                if (var4 < 0) {
  135.                   break;
  136.                }
  137.  
  138.                var3[var4] = var4 * 3;
  139.             }
  140.          }
  141.  
  142.          int var9 = this.nvert - 1;
  143.  
  144.          boolean var5;
  145.          do {
  146.             --var9;
  147.             if (var9 < 0) {
  148.                break;
  149.             }
  150.  
  151.             var5 = 0;
  152.  
  153.             for(int var6 = 0; var6 <= var9; ++var6) {
  154.                int var7 = var3[var6];
  155.                int var8 = var3[var6 + 1];
  156.                if (var2[var7 + 2] > var2[var8 + 2]) {
  157.                   var3[var6 + 1] = var7;
  158.                   var3[var6] = var8;
  159.                   var5 = 1;
  160.                }
  161.             }
  162.          } while(var5);
  163.  
  164.          var5 = this.nvert;
  165.          if (var5 > 0 && this.nvert > 0) {
  166.             for(int var11 = 0; var11 < var5; ++var11) {
  167.                int var12 = var3[var11];
  168.                int var13 = var2[var12 + 2];
  169.                if (var13 < 0) {
  170.                   var13 = 0;
  171.                } else if (var13 > 15) {
  172.                   var13 = 15;
  173.                }
  174.  
  175.                this.atoms[var12 / 3].paint(var1, var2[var12], var2[var12 + 1], var13);
  176.             }
  177.  
  178.          }
  179.       }
  180.    }
  181.  
  182.    void findBB() {
  183.       if (this.nvert > 0) {
  184.          float[] var1 = this.vert;
  185.          float var2 = var1[0];
  186.          float var3 = var2;
  187.          float var4 = var1[1];
  188.          float var5 = var4;
  189.          float var6 = var1[2];
  190.          float var7 = var6;
  191.          int var8 = this.nvert * 3;
  192.  
  193.          while(true) {
  194.             var8 -= 3;
  195.             if (var8 <= 0) {
  196.                this.xmax = var3;
  197.                this.xmin = var2;
  198.                this.ymax = var5;
  199.                this.ymin = var4;
  200.                this.zmax = var7;
  201.                this.zmin = var6;
  202.                return;
  203.             }
  204.  
  205.             float var9 = var1[var8];
  206.             if (var9 < var2) {
  207.                var2 = var9;
  208.             }
  209.  
  210.             if (var9 > var3) {
  211.                var3 = var9;
  212.             }
  213.  
  214.             float var10 = var1[var8 + 1];
  215.             if (var10 < var4) {
  216.                var4 = var10;
  217.             }
  218.  
  219.             if (var10 > var5) {
  220.                var5 = var10;
  221.             }
  222.  
  223.             float var11 = var1[var8 + 2];
  224.             if (var11 < var6) {
  225.                var6 = var11;
  226.             }
  227.  
  228.             if (var11 > var7) {
  229.                var7 = var11;
  230.             }
  231.          }
  232.       }
  233.    }
  234.  
  235.    static {
  236.       atomTable.put("c", new Atom(0, 0, 0));
  237.       atomTable.put("h", new Atom(210, 210, 210));
  238.       atomTable.put("n", new Atom(0, 0, 255));
  239.       atomTable.put("o", new Atom(255, 0, 0));
  240.       atomTable.put("p", new Atom(255, 0, 255));
  241.       atomTable.put("s", new Atom(255, 255, 0));
  242.       atomTable.put("hn", new Atom(150, 255, 150));
  243.       defaultAtom = new Atom(255, 100, 200);
  244.    }
  245. }
  246.